﻿/**
 *		xml操作接口
 *@author		吴建凰
 *@date			2016年9月28日
 */
#ifndef OSS_XML_H_
#define OSS_XML_H_
#include "ossType.h"

/**
 *      感谢csdn微博提供的示例参考（http://www.cnblogs.com/Anker/p/3542058.html
                                    ,http://www.cnblogs.com/joeyupdo/articles/2619930.html）
 *@date     2016年9月29日
 */

OSS_EXTERN_BEG

//定义xml的文档类型
typedef Handle HXmlDoc;

//定义xml的节点类型
typedef Handle HXmlNode;

//定义xml属性类型
typedef Handle HXmlAttr;

/**
 *      解析xml文件
 *@strXmlFilePath      xml文件路径
 *@return       成功返回 xml的操作句柄
 *              失败返回 NULL
 */
HXmlDoc OssXmlParseFile(const char* strXmlFilePath);

/**
 *      新建一个xml文件
 */
HXmlDoc  OssXmlNewDoc();

/**
 *      获取root节点
 *@hXmlDoc      xml文档操作句柄 
 *@return       成功返回root节点句柄
 *              失败返回 NULL
 */
HXmlNode OssXmlGetRootNode(HXmlDoc hXmlDoc);

/**
 *      设置文档的root节点
 *@hXmlDoc      当前文档
 *@hRootNode    root节点
 *@return       成功返回 TRUE
 *              失败返回 FALSE
 */
Bool OssXmlSetRootNode(HXmlDoc hXmlDoc,HXmlNode hRootNode);

/**
 *      添加一个子节点
 *@hParentNode      父节点
 *@hChildNode       子节点
 *@return           成功返回 TRUE
 *                  失败返回 FALSE
 */
Bool OssXmlAddChild(HXmlNode hParentNode,HXmlNode hChildNode);

/**
 *      创建一个新的节点
 *@strNodeName      节点名称
 *@return           成功返回节点句柄
 *                  失败返回 NULL
 */
HXmlNode OssXmlNewNode(const char* strNodeName);

/**
 *      创建一个属性
 *@hCurrentNode     当前的节点
 *@strPropName      属性名称
 *@strPropValue     属性值
 *@return           成功返回属性句柄
 *                  失败返回 NULL
 */
HXmlAttr OssXmlNewProp(HXmlNode hCurrentNode,const char *strPropName,const char *strPropValue);
HXmlAttr OssXmlNewPropInt(HXmlNode hCurrentNode,const char *strPropName,int iPropValue);

/**
 *      创建一个子节点
 */
HXmlNode OssXmlNewChild(HXmlNode hParentNode,const char *strNodeName,const char *strContent);

/**
 *       保存当前doc
 *@strFilename      保存文件的路径
 *@hCurDoc          当前需要保存的xml文档
 *@return           成功返回 TRUE
 *                  失败返回 FALSE
 */
Bool OssXmlSave(const char *strFilename, HXmlDoc hCurDoc);

/**
 *      释放当前文档
 *@hCurDoc      当前文档句柄
 *@return       成功返回 TRUE
 *              失败返回 FALSE
 */
Bool OssXmlFreeDoc(HXmlDoc hCurDoc);


/**
 *      获取与当前节点平行的兄弟节点
 */
HXmlNode OssXmlNextBrotherNode(HXmlNode hNode);

/**
 *      获取第一个子节点
 */
HXmlNode OssXmlFirstChildNode(HXmlNode hNode);

/**
 *      查找子节点
 *@hParentNode  父节点
 *@pcNodeName   节点名称
 */
HXmlNode OssXmlFindChildNode(HXmlNode hParentNode,const char* pcNodeName);

/**
 *      查找同级节点
 *@hParentNode  父节点
 *@pcNodeName   节点名称
 */
HXmlNode OssXmlFindBrotherNode(HXmlNode hParentNode,const char* pcNodeName);

/**
 *      获取当前节点的名称
 */
char* OssXmlGetNodeName(HXmlNode hNode);

/**
 *      获取当前节点的元素内容
 */
char* OssXmlGetNodeContent(HXmlNode hNode);

/**
 *      判断是否当前节点是否存在指定的属性
 */
HXmlAttr OssXmlHasProp(HXmlNode hNode,const char* strPropName);



/**
 *      获取指定属性的值
 */
const char* OssXmlGetPropValueByName(HXmlNode hNode,const char* strPropName);

/**
 *      获取指定节点的第一个属性
 */
HXmlAttr OssGetFirstAttr(HXmlNode hNode);

/**
 *      获取指定属性的下一个属性
 */
HXmlAttr OssGetNextAttr(HXmlNode hNode,HXmlAttr currentAttr);

/**
 *      获取当前属性的名称
 */
const char* OssXmlGetPropName(HXmlAttr hAttr);


/**
 *      获取当前属性的值
 */
const char* OssXmlGetPropValue(HXmlAttr hAttr);
OSS_EXTERN_END

#ifdef __cplusplus
class OssXml
{
public:
    OssXml()
    {
    }
    virtual ~OssXml()
    {
    }

    /**
     *      解析xml文件
     *@strXmlFilePath      xml文件路径
     *@return       成功返回 xml的操作句柄
     *              失败返回 NULL
     */
    HXmlDoc ParseFile(const char* strXmlFilePath)
    {
        return OssXmlParseFile(strXmlFilePath);
    }

    /**
     *      新建一个xml文件
     */
    HXmlDoc  OssXmlNewDoc()
    {
        return OssXmlNewDoc();
    }

    /**
     *      获取root节点
     *@hXmlDoc      xml文档操作句柄
     *@return       成功返回root节点句柄
     *              失败返回 NULL
     */
    HXmlNode GetRootNode(HXmlDoc hXmlDoc)
    {
        return OssXmlGetRootNode(hXmlDoc);
    }

    /**
     *      设置文档的root节点
     *@hXmlDoc      当前文档
     *@hRootNode    root节点
     *@return       成功返回 TRUE
     *              失败返回 FALSE
     */
    Bool SetRootNode(HXmlDoc hXmlDoc, HXmlNode hRootNode)
    {
        return OssXmlSetRootNode(hXmlDoc, hRootNode);
    }

    /**
     *      添加一个子节点
     *@hParentNode      父节点
     *@hChildNode       子节点
     *@return           成功返回 TRUE
     *                  失败返回 FALSE
     */
    Bool AddChild(HXmlNode hParentNode, HXmlNode hChildNode)
    {
        return OssXmlAddChild(hParentNode, hChildNode);
    }

    /**
     *      创建一个新的节点
     *@strNodeName      节点名称
     *@return           成功返回节点句柄
     *                  失败返回 NULL
     */
    HXmlNode NewNode(const char* strNodeName)
    {
        return OssXmlNewNode(strNodeName);
    }

    /**
     *      创建一个属性
     *@hCurrentNode     当前的节点
     *@strPropName      属性名称
     *@strPropValue     属性值
     *@return           成功返回属性句柄
     *                  失败返回 NULL
     */
    HXmlAttr NewProp(HXmlNode hCurrentNode, const char* strPropName, const char* strPropValue)
    {
        return OssXmlNewProp(hCurrentNode, strPropName, strPropValue);
    }
    HXmlAttr NewPropInt(HXmlNode hCurrentNode, const char* strPropName, int iPropValue)
    {
        return OssXmlNewPropInt(hCurrentNode, strPropName, iPropValue);
    }

    /**
     *      创建一个子节点
     */
    HXmlNode NewChild(HXmlNode hParentNode,const char* strNodeName,const char* strContent)
    {
        return OssXmlNewChild(hParentNode, strNodeName, strContent);
    }

    /**
     *       保存当前doc
     *@strFilename      保存文件的路径
     *@hCurDoc          当前需要保存的xml文档
     *@return           成功返回 TRUE
     *                  失败返回 FALSE
     */
    Bool Save(const char* strFilename, HXmlDoc hCurDoc)
    {
        return OssXmlSave(strFilename, hCurDoc);
    }

    /**
     *      释放当前文档
     *@hCurDoc      当前文档句柄
     *@return       成功返回 TRUE
     *              失败返回 FALSE
     */
    Bool FreeDoc(HXmlDoc hCurDoc)
    {
        return OssXmlFreeDoc(hCurDoc);
    }


    /**
     *      获取与当前节点平行的兄弟节点
     */
    HXmlNode NextBrotherNode(HXmlNode hNode)
    {
        return OssXmlNextBrotherNode(hNode);
    }

    /**
     *      获取第一个子节点
     */
    HXmlNode FirstChildNode(HXmlNode hNode)
    {
        return OssXmlFirstChildNode(hNode);
    }

    /**
     *      查找子节点
     *@hParentNode  父节点
     *@pcNodeName   节点名称
     */
    HXmlNode FindChildNode(HXmlNode hParentNode, const char* pcNodeName)
    {
        return OssXmlFindChildNode(hParentNode, pcNodeName);
    }

    /**
     *      查找同级节点
     *@hParentNode  父节点
     *@pcNodeName   节点名称
     */
    HXmlNode FindBrotherNode(HXmlNode hParentNode, const char* pcNodeName)
    {
        return OssXmlFindBrotherNode(hParentNode, pcNodeName);
    }

    /**
     *      获取当前节点的名称
     */
    const char* GetNodeName(HXmlNode hNode)
    {
        return OssXmlGetNodeName(hNode);
    }

    /**
     *      获取当前节点的元素内容
     */
    const char* GetNodeContent(HXmlNode hNode)
    {
        return OssXmlGetNodeContent(hNode);
    }

    /**
     *      判断是否当前节点是否存在指定的属性
     */
    HXmlAttr HasProp(HXmlNode hNode, const char* strPropName)
    {
        return OssXmlHasProp(hNode, strPropName);
    }

    /**
     *      获取指定属性的值
     */
    const char* GetPropValueByName(HXmlNode hNode, const char* strPropName)
    {
        return OssXmlGetPropValueByName(hNode, strPropName);
    }

    /**
 *      获取指定节点的第一个属性
 */
    HXmlAttr GetFirstAttr(HXmlNode hNode)
    {
        return OssGetFirstAttr(hNode);
    }

    /**
     *      获取指定属性的下一个属性
     */
    HXmlAttr GetNextAttr(HXmlNode hNode, HXmlAttr currentAttr)
    {
        return OssGetNextAttr(hNode, currentAttr);
    }

    /**
     *      获取当前属性的名称
     */
    const char* GetPropName(HXmlAttr hAttr)
    {
        return OssXmlGetPropName(hAttr);
    }

    /**
     *      获取当前属性的值
     */
    const char* GetPropValue(HXmlAttr hAttr)
    {
        return OssXmlGetPropValue(hAttr);
    }
};
#endif

#endif